#!/bin/bash

#|***************************************
#|------脚本说明
#|------1）本脚本用于支持带有版本后缀的jar包启动，格式为：{基础名称}-{版本号}.jar，如myapp-1.0.jar、myapp-2.3.1.jar、myapp-3.0-SNAPSHOT.jar
#|------2）不支持不带后缀版本号的jar包，如：myapp.jar 、  myapp-1.0-executable.jar 
#|***************************************


#----------------1.启动参数
# 指定环境
export SPRING_PROFILES_ACTIVE=prod
# 应用基本名称、端口
APP_BASE_NAME="qia-hao"
APP_PORT=8888  
# JVM参数                 
JVM_OPTIONS="-Xms256m -Xmx256m" 
# 打印GC详情、添加时间戳、并实现GC日志转存
GC_LOG_OPTS="-XX:+PrintGCDetails \
			 -XX:+PrintGCDateStamps \
			 -XX:+UseGCLogFileRotation \
			 -XX:NumberOfGCLogFiles=5 \
			 -XX:GCLogFileSize=10M \
			 -Xloggc:./gcLogs/gc-%t.log"

# 创建日志目录
#mkdir -p ./logs
mkdir -p ./gcLogs

#----------------2.启动前检查
#############################
#---2.1 检查最新版本的jar
#############################
find_latest_jar() {
  # 查找匹配基础名称的JAR文件
  local jar_files=$(ls -1 ${APP_BASE_NAME}-*.jar 2>/dev/null)
  
  if [ -z "$jar_files" ]; then
    echo "[ERROR] 找不到匹配 ${APP_BASE_NAME}-*.jar 的应用文件!"
    exit 1
  fi
  
  # 按版本号排序（降序）取第一个
  local latest_jar=$(echo "$jar_files" | sort -V -r | head -1)
  
  # 验证文件存在
  if [ ! -f "$latest_jar" ]; then
    echo "[ERROR] 找到的最新JAR文件不存在: $latest_jar"
    exit 1
  fi
  
  echo "$latest_jar"
}

# 获取最新JAR文件
APP_NAME=$(find_latest_jar)
echo "使用JAR文件: $APP_NAME"

# 检查应用文件是否存在
if [ ! -f "$APP_NAME" ]; then
  echo "[ERROR] 应用文件 $APP_NAME 未找到!"
  exit 1
fi

#############################
#---2.2 检查进程是否存在
#############################
check_process() {
  # 进程号
  PID=$(ps -ef | grep "$APP_NAME" | grep -v grep | awk '{print $2}')
  
  # 端口号（可选）
  PORT_PID=$(lsof -t -i:$APP_PORT)
  
  if [ -n "$PID" ] || [ -n "$PORT_PID" ]; then
    echo "[WARN] 应用已在运行中!"
    echo "通过JAR名称找到的PID: ${PID:-无}"
    echo "通过端口 $APP_PORT 找到的PID: ${PORT_PID:-无}"
    
    read -p "是否停止现有进程并重启? (y/n): " choice
    case "$choice" in
      y|Y )
        echo "停止现有进程..."
        [ -n "$PID" ] && kill $PID
        [ -n "$PORT_PID" ] && kill $PORT_PID
        sleep 5
        ;;
      * )
        echo "操作已取消"
        exit 0
        ;;
    esac
  fi
}

# 执行进程检查
check_process

#----------------3.启动进程
echo "启动 $APP_NAME ..."
#nohup java $JVM_OPTIONS $GC_LOG_OPTS -jar $APP_NAME >> ./logs/application.log 2>&1 & 
nohup java $JVM_OPTIONS $GC_LOG_OPTS -jar $APP_NAME > /dev/null 2>&1 & #因为项目中logback-spring.xml中已指定日志输出路径，因此这里不再指定日志输出路径

# 显示启动信息
echo "应用启动中..."
echo "堆内存设置: $JVM_OPTIONS"
echo "GC日志输出: ./gcLogs/gc.log"
echo "应用日志输出: ./logs/application.log"
echo "PID: $!"

# 添加健康检查（可选）
echo "等待应用启动(10秒)..."
sleep 10
if netstat -tuln | grep -q ":$APP_PORT"; then
  echo "[SUCCESS] 应用启动成功! 端口 $APP_PORT 已监听"
else
  echo "[WARNING] 应用端口 $APP_PORT 未检测到监听，请检查日志"
fi